10.15考试反思
Contest2170 - 2019年10月多校联训B层测试11
T1 衣服
http://www.accoders.com/problem.php?cid=2170&pid=0
首先这题很显然是个贪心,我们考虑如何贪心。我们看颜色种类,最多只有四种,所以我们考虑开4个优先队列,把所有衣服上的颜色都推到优先队列里,比如衣服1有123三个颜色,就把衣服1的价值推到编号为123的队列中。然后将询问离线,每次取当前这个所需要的颜色的队首元素,然后对于这个衣服,我们拿过了,加一个vis数组,然后下次遇到这个衣服的时候,把它pop掉就可以啦

1 #include <bits/stdc++.h> 2 #define ll long long 3 #define res register 4 #define MAXN 200050 5 #define int ll 6 using namespace std; 7 int n,m,want[MAXN],color[MAXN]; 8 bool vis[MAXN]; 9 struct Node{ 10 int a,b,val,num; 11 friend inline bool operator<(Node a,Node b){ 12 if(a.val!=b.val) 13 return a.val>b.val; 14 } 15 }c[MAXN]; 16 priority_queue<Node>q[4]; 17 ll read() 18 { 19 int s=0,w=1;char ch=getchar(); 20 while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} 21 while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-48;ch=getchar();} 22 return s*w; 23 } 24 signed main() 25 { 26 n=read(); 27 for(res int i=1;i<=n;i++) c[i].val=read(),c[i].num=i; 28 for(res int i=1;i<=n;i++) c[i].a=read(); 29 for(res int i=1;i<=n;i++) c[i].b=read(); 30 m=read(); 31 for(res int i=1;i<=n;i++){ 32 q[c[i].a].push(c[i]); 33 q[c[i].b].push(c[i]); 34 } 35 for(res int i=1;i<=m;i++) want[i]=read(); 36 for(res int i=1;i<=m;i++){ 37 if(q[want[i]].empty()) {cout<<"-1"<<" ";continue;} 38 while(vis[q[want[i]].top().num]) q[want[i]].pop(); 39 printf("%lld ",q[want[i]].top().val); 40 vis[q[want[i]].top().num]=1; 41 q[want[i]].pop(); 42 } 43 return 0; 44 }
T2 分段
http://www.accoders.com/problem.php?cid=2170&pid=1
玄学(常规DP)考虑对于一个新的点,我们有两种处理办法,第一种是把他安排在一个已经求过的区间中,不然就是把他单起一个区间。根据这个思路进行转移即可
T3 拜访
http://www.accoders.com/problem.php?cid=2170&pid=2
没啥好说的,最短路裸题,给了15s,看似卡死了其他做法,却给暴力带来了无限生机。你遇到修改的时候,把这条路的权值+1,然后重新跑spfa就完事了

1 #include <bits/stdc++.h> 2 #define ll long long 3 #define res register 4 #define MAXN 100050 5 #define int ll 6 using namespace std; 7 int x,y,z,n,m,head[MAXN],diss[MAXN],as,op; 8 bool vis[MAXN],ju; 9 struct Node{ 10 int to,nxt,dis; 11 }g[MAXN]; 12 inline void add(int u,int v,int dis){ 13 static int top=0; 14 g[++top].to=v;g[top].nxt=head[u]; 15 g[top].dis=dis;head[u]=top; 16 } 17 deque<int>q; 18 inline void spfa(){ 19 memset(diss,0x7f7f7f,sizeof(diss)); 20 diss[1]=0;q.push_front(1); 21 while(!q.empty()){ 22 int now=q.front();q.pop_front();vis[now]=0; 23 for(res int i=head[now];i;i=g[i].nxt){ 24 int to=g[i].to,dis2=g[i].dis; 25 if(diss[to]>diss[now]+dis2){ 26 diss[to]=diss[now]+dis2; 27 if(!vis[to]){ 28 vis[to]=1;if(q.empty()||diss[to]>diss[q.front()])q.push_back(to); 29 else q.push_front(to); 30 } 31 } 32 } 33 } 34 35 } 36 ll read() 37 { 38 int s=0,w=1;char ch=getchar(); 39 while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} 40 while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-48;ch=getchar();} 41 return s*w; 42 } 43 signed main() 44 { 45 n=read(),m=read(),as=read(); 46 for(res int i=1;i<=m;i++){ 47 x=read(),y=read(),z=read(); 48 add(x,y,z); 49 } 50 for(res int i=1;i<=as;i++){ 51 op=read(),x=read(); 52 if(op==1) { 53 if(ju) printf("%lld\n",diss[x]>=0x7f7f7f?-1:diss[x]); 54 else {spfa();printf("%lld\n",diss[x]>=0x7f7f7f?-1:diss[x]);ju=1;} 55 } 56 else{ 57 for(res int i=1;i<=x;i++) 58 g[read()].dis++,ju=0; 59 } 60 } 61 return 0; 62 }