懒人标记

http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1149&pid=3

懒人标记代码o(n)

#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
const int N=100;
int main()
{
    int a[N],b[N],dp[N];
    queue<int> q;
    int i,j,k,tmp,n,m,text;
    cin>>text;
    while(text--)
    {
        memset(dp,0,sizeof(dp));
        cin>>n>>m;
        for(i=0;i<m;i++)    cin>>a[i]>>b[i],dp[a[i]]++,dp[b[i]+1]--;//标记  1    -1
        for(i=2;i<=n;i++)    dp[i]+=dp[i-1];//每间房打扫 的次数
        for(i=1;i<=n;i++)    if(dp[i]!=1&&dp[i]!=0) dp[i]=0;else dp[i]=1;//将打扫0 1次的房间标记为1
        for(i=1;i<=n;i++)    dp[i]+=dp[i-1];//前i个有 几个打扫房间打扫0 1次
        for(i=0;i<m;i++)    if(dp[b[i]]-dp[a[i]-1]==0)    q.push(i+1);//判断是否有 打扫0 1次的房间
        cout<<q.size()<<endl;
        if(q.size()==0) continue;
        tmp=q.front();
        q.pop();
        cout<<tmp;
        while(!q.empty())
        {
            tmp=q.front();
            q.pop();
            cout<<" "<<tmp;
        }
        cout<<endl;
    }
}

http://acm.hdu.edu.cn/showproblem.php?pid=1556

#include <cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define lson l,m,rt<< 1
#define rson m+1,r,rt<<1|1
const int N=100000+10;
int s[N];
int main()
{
    int m,n,i,j,k,ans,tmp;
    while(scanf("%d",&n),n)
    {
        int a,b;
        memset(s,0,sizeof(s));
        for(i=0;i<n;i++)    scanf("%d%d",&a,&b),s[a]++,s[b+1]--;
        for(i=1;i<=n;i++)   s[i]+=s[i-1];
        for(i=1;i<n;i++)   cout<<s[i]<<" ";
        cout<<s[n]<<endl;
    }
    return 0;
}

你可能感兴趣的:(懒人标记)