国庆 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;
}
View Code

 

 

思路: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;
    }    
}
View Code

思路: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
*/
View Code

 

posted @ 2017-10-09 19:03  一蓑烟雨任生平  阅读(209)  评论(0编辑  收藏  举报