国庆 day 7 下午
思路:见博客。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MAXN 100001 using namespace std; int n,cnt,ans; struct nond{ int col,num; }v[MAXN],bns[MAXN]; int cmp(nond a,nond b){ if(a.col==b.col) return a.num<b.num; return a.col<b.col; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&v[i].col,&v[i].num); sort(v+1,v+1+n,cmp); for(int i=1;i<=n;i++) if(v[i-1].col!=v[i].col||v[i-1].num!=v[i].num) bns[++cnt]=v[i]; for(int i=1;i<=cnt;i++){ int tmp=0; for(int j=i;j>=1;j--) if(bns[i].col==bns[j].col&&bns[i].num-bns[j].num+1<=n) tmp++; else break; if(tmp>ans) ans=tmp; } cout<<n-ans; }
思路:f[i]表示状态i最后一次出现的位置。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100100 using namespace std; int n,ans; int f[MAXN]; int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ int a,b; scanf("%d%d",&a,&b); int tmp=a;ans=0; while(tmp){ if(f[tmp]<i-b) ans++; f[tmp]=i; tmp=a&(tmp-1); } cout<<ans<<endl; } }
思路:tarjin缩点+spfa跑最长路。
#include<map> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 500100 using namespace std; queue<int>que; map<int,int>ma[MAXN]; int n,m,S,p; int tot,tot1,ans; int tim,top,sumcol; int vis[MAXN],dis[MAXN]; int w[MAXN],col[MAXN],val[MAXN]; int to[MAXN],net[MAXN],head[MAXN]; int to1[MAXN],net1[MAXN],head1[MAXN]; int dfn[MAXN],low[MAXN],stack[MAXN],visstack[MAXN]; void add(int u,int v){ to[++tot]=v;net[tot]=head[u];head[u]=tot; } void add1(int u,int v){ to1[++tot1]=v;net1[tot1]=head1[u];head1[u]=tot1; } void tarjin(int now){ low[now]=dfn[now]=++tim; stack[++top]=now; vis[now]=1; visstack[now]=1; for(int i=head[now];i;i=net[i]) if(visstack[to[i]]) low[now]=min(low[now],dfn[to[i]]); else if(!vis[to[i]]){ tarjin(to[i]); low[now]=min(low[now],low[to[i]]); } if(dfn[now]==low[now]){ sumcol++; col[now]=sumcol; while(stack[top]!=now){ visstack[stack[top]]=0; col[stack[top]]=sumcol; top--; } visstack[now]=0; top--; } } void spfa(int s){ memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); while(!que.empty()) que.pop(); que.push(s); vis[s]=1;dis[s]=val[s]; while(!que.empty()){ int now=que.front(); que.pop(); vis[now]=0; for(int i=head1[now];i;i=net1[i]) if(dis[to1[i]]<dis[now]+val[to1[i]]){ dis[to1[i]]=dis[now]+val[to1[i]]; if(!vis[to1[i]]){ vis[to1[i]]=1; que.push(to1[i]); } } } } int main(){ freopen("save.in","r",stdin); freopen("save.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); } for(int i=1;i<=n;i++) if(!vis[i]) tarjin(i); for(int i=1;i<=n;i++){ scanf("%d",&w[i]); val[col[i]]+=w[i]; } for(int i=1;i<=n;i++) for(int j=head[i];j;j=net[j]) if(col[i]!=col[to[j]]) if(ma[col[i]].find(col[to[j]])==ma[col[i]].end()){ ma[col[i]][col[to[j]]]=1; add1(col[i],col[to[j]]); } scanf("%d%d",&S,&p); spfa(col[S]); for(int i=1;i<=p;i++){ int x; scanf("%d",&x); ans=max(ans,dis[col[x]]); } cout<<ans<<endl; } /* 6 7 1 2 2 3 3 5 2 4 4 1 2 6 6 5 10 12 8 16 1 5 1 4 4 3 5 6 */
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。