Codeforces Round #401 (Div. 2)(C,D,E)

来源:互联网 发布:桌面网络图标不见了 编辑:程序博客网 时间:2024/05/25 19:55

/*C. Alyona and Spreadsheet时间: 2017/02/25题意:给出q个询问,问第l行到第r行是否存在一列是非单调递减的。题解:建一个数组:f[i] 代表i行最多能非单调递减到达的行数对于每列不断更新这个数组即可,*/#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<map>using namespace std;#define LL long long#define N 100010#define INF 0x3f3f3f3fint a[N],f[N];int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        for(int i = 1; i <= n*m ; i++)            scanf("%d",&a[i]);        int k;        for(int i = 1; i <= m; i++)        {            for(int j = 1; j <= n; j = k)            {                for(k = j+1; k <= n ; k++)                    if(a[(k-2)*m+i] > a[(k-1)*m+i])                        break;                for(int p = j; p < k; p++)                        f[p] = max(f[p],k-1);            }        }        int q;        scanf("%d",&q);        int l,r;        while(q--)        {            scanf("%d%d",&l,&r);            if(f[l] >= r)                puts("Yes");            else                puts("No");        }    }    return 0;}



/*D. Cloud of Hashtags时间: 2017/02/25题意:删去最少的字符,使其满足字典序排序题解:这题我以为会爆迟迟不敢动手,明显需要从后往前推,记录其删去到的字符长度比较方便。*/#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<map>using namespace std;#define LL long long#define N 500010#define INF 0x3f3f3f3fstring s[N];int l[N];int main(){    int n;    while(~scanf("%d",&n))    {        for(int i = 0; i < n; i++)        {            cin >> s[i];            l[i] = s[i].size();        }        for(int i = n-2; i >= 0; i--)        {            int len = min(l[i],l[i+1]);            int flag = 0;            int j;            for(j = 0; j < len; j++)            {                if(s[i][j] > s[i+1][j])                {                    l[i] = j;                    break;                }                else if(s[i][j] < s[i+1][j])                {                    flag = 1;                    break;                }            }            if(!flag && j == len)   l[i] = len;        }        for(int i = 0; i < n; i++)        {            for(int j = 0; j < l[i]; j++)                printf("%c",s[i][j]);            puts("");        }    }    return 0;}



/*E. Hanoi Factory时间: 2017/02/25题意:叠塔,但要满足a(i+1) < bi <= b(i+1)题解:标程是线段树+LIS群里说贪心也能做,排序b从小到大,在b相同排序a从小到大,使其满足如果i-1不能取,那么i-2也不能取,这样从后往前推入栈,如果不满足推出栈直到满足再推入栈,每次推入的答案记录最大值即可。*/#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<map>using namespace std;#define LL long long#define N 100010#define INF 0x3f3f3f3fstruct point{    int x,y,h;} a[N];bool cmp(point a,point b){    if(a.y != b.y) return a.y < b.y;    return a.x < b.x;}int dp[N];int main(){    int n;    while(~scanf("%d",&n))    {        for(int i = 0; i < n; i++)            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h);        sort(a,a+n,cmp);        stack<point> p;        LL ans = 0;        LL mx = 0;        for(int i = n-1; i >= 0; i--)        {            while(1)            {                if(p.empty())                    break;                point f = p.top();                if(f.y >= a[i].y && f.x < a[i].y)                    break;                ans -= f.h;                p.pop();            }            p.push(a[i]);            ans += a[i].h;            mx = max(mx,ans);        }        printf("%I64d\n",mx);    }    return 0;}


0 0
原创粉丝点击