2019山東省賽部分題解

Tokens on the Segments

馬上上課了,,先貼代碼

貪心,比賽時沒想到這麼貪也能過,以爲會T......就沒有寫

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
int n,ans;
struct node
{
    int l,r;
}a[N];
bool cmp(node x,node y)
{
    if(x.l==y.l)
        return x.r<y.r;
    return x.l<y.l;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i].l,&a[i].r);
        sort(a+1,a+1+n,cmp);
        map<int,int>mp;
        mp.clear();
        ans=0;
        for(int i=n;i>=1;i--){
            for(int j=a[i].r;j>=a[i].l;j--){
                if(mp[j]==0){
                    mp[j]=1;
                    ans++;
                    break;
                }
            }
        }
        printf("%d\n",ans);
    }
}

Median

思路:拓撲排序判環,在對於每一個點正向搜索小於它的點,反向搜大於它的點,對於這些點只要滿足num1[i]<=n/2 &&num2[i]<=n/2, 即可,對於不同連通圖中的點不需要考慮

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=110;
int head[N],rhead[N];
int num1[N],num2[N];
int in1[N];
int n,m,tot1,tot2;
bool vis[N];
struct node
{
    int ne,v;
}e[N*N],re[N*N];
bool tuopu()//判環
{
    queue<int>q;
    for(int i=1;i<=n;i++)
        if(in1[i]==0)
            q.push(i);
            int cnt=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        cnt++;
        for(int i=head[u];i;i=e[i].ne){
                int v=e[i].v;
            in1[v]--;
            if(in1[v]==0)
                q.push(v);
        }
    }
    return cnt==n;
}
void bfs2()
{
    queue<int>que;
    for(int i=1;i<=n;i++){
            met(vis,0);
      que.push(i);
      vis[i]=1;
      int ans=0;
      while(!que.empty()){
        int u=que.front();
        que.pop();
        for(int j=head[u];j;j=e[j].ne){
            int x=e[j].v;
             if(vis[x])
               continue;
            ans++;
            que.push(x);
            vis[x]=1;
        }
      }
      num1[i]=ans;
  }
}
void bfs()
{
    queue<int>que;
    for(int i=1;i<=n;i++){
            met(vis,0);
      que.push(i);
      vis[i]=1;
      int ans=0;
      while(!que.empty()){
        int u=que.front();
        que.pop();
        for(int j=rhead[u];j;j=re[j].ne){
            int x=re[j].v;
            if(vis[x])
                continue;
            ans++;
            que.push(x);
            vis[x]=1;
        }
      }
      num2[i]=ans;
  }
}
void add1(int x,int y)
{
    e[++tot1].ne=head[x];
    e[tot1].v=y;
    head[x]=tot1;
}
void add2(int x,int y)
{
    re[++tot2].ne=rhead[x];
    re[tot2].v=y;
    rhead[x]=tot2;
}
int main()
{
    int t;
    scanf("%d",&t);
        while(t--){
            int x,y;
        scanf("%d%d",&n,&m);
        tot1=0;
        tot2=0;
        for(int i=0;i<=n;i++){
                num1[i]=0;
                num2[i]=0;
                head[i]=0;
                rhead[i]=0;
                in1[i]=0;
            }
        bool flag=false;
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            if(x==y)
              flag=true;
            add1(x,y);
            add2(y,x);
            in1[y]++;
        }
        if(flag){
            for(int i=1;i<=n;i++)
                printf("0");
                printf("\n");
            continue;
        }
        if(tuopu()){
            bfs2();
            bfs();
            for(int i=1;i<=n;i++){
                if(num1[i]<=n/2&&num2[i]<=n/2)
                    printf("1");
                else printf("0");
            }
            printf("\n");
        }
        else {
            for(int i=1;i<=n;i++)
                printf("0");
                printf("\n");
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章