Codeforces Round #401 (div.2)

自己的号2000+了....临时找了一个1540的号,和一个大佬@ditoly一起打...

这是大佬↓

迟到了一下,过了十分钟才报名.....

A.......

B.你有n个数,对面也有n个数,两两对决!!!

求最多大于对面的数多少场,大等于对面的数多少场。

直接贪心

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int s[1005],s2[1005];
int n;

int solve(int*a,int*b)
{
    int l1=1,r1=n,l2=1,r2=n;int sum=0;
    while(l1<=r1)
    {
        if(a[l1]>b[l2]) {++l2;++l1;++sum;}
        else if(a[r1]>b[r2]){sum++;--r1;--r2;}
        else {sum+=a[l1]>b[r2];++l1;--r2;}
    }
    return sum;
}

int solve2(int *a,int*b)
{
    int sum=n;int l1=1,r1=n,l2=1,r2=n;
    while(l1<=r1)
    {
        if(a[l1]>=b[l2]) {++l2;++l1;--sum;}
        else if(a[r1]>=b[r2]){sum--;--r1;--r2;}
        else {sum-=(a[l1]>=b[r2]);++l1;--r2;}
    }
    return sum;
}

int main()
{
   n=read();
   for(int i=1;i<=n;i++)
         s[i]=getchar()-‘0‘;
   getchar();
   for(int i=1;i<=n;i++)
      s2[i]=getchar()-‘0‘;
   sort(s+1,s+n+1);
   sort(s2+1,s2+n+1);
   printf("%d\n%d",solve2(s2,s),solve(s2,s));
   return 0;
}

C

给定一个矩阵,每次给一个lr,求第l到第r行有没有一列是不降的

预处理每一个点最上到多少是不降的,直接暴力...

这是ditoly写的

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
inline int read()
{
    int x=0;char c;
    while((c=getchar())<‘0‘||c>‘9‘);
    for(;c>=‘0‘&&c<=‘9‘;c=getchar())x=(x<<3)+(x<<1)+c-‘0‘;
    return x;
}
#define MN 100000
#define N 131072
#define INF 0x7FFFFFFF
vector<int> v[MN+5];
vector<pair<int,int> > q[MN+5];
int t[N*2+5],ans[MN+5];
void change(int k,int x){for(t[k+=N]=x;k>>=1;)t[k]=min(t[k<<1],t[(k<<1)+1]);}
int main()
{
    int n,m,k,i,j;
    n=read();m=read();
    for(i=0;i<=m;++i)v[0].push_back(INF);
    for(i=1;i<=n;++i)v[i].push_back(0);
    for(i=1;i<=n;++i)for(j=1;j<=m;++j)v[i].push_back(read());
    for(k=read(),i=0;i<k;++i)j=read(),q[read()].push_back(make_pair(j,i));
    memset(t,127,sizeof(t));
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)if(v[i][j]<v[i-1][j])change(j,i);
        for(j=0;j<q[i].size();++j)ans[q[i][j].second]=(t[1]<=q[i][j].first);
    }
    for(i=0;i<k;++i)puts(ans[i]?"Yes":"No");
}

d

给n个字符串,求最少删去多少个字符可以让这些串按照字典序排列。

这个也是ditoly写的。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
inline int read()
{
    int x=0;char c;
    while((c=getchar())<‘0‘||c>‘9‘);
    for(;c>=‘0‘&&c<=‘9‘;c=getchar())x=(x<<3)+(x<<1)+c-‘0‘;
    return x;
}
#define MN 100000
#define N 131072
#define INF 0x7FFFFFFF
vector<int> v[MN+5];
vector<pair<int,int> > q[MN+5];
int t[N*2+5],ans[MN+5];
void change(int k,int x){for(t[k+=N]=x;k>>=1;)t[k]=min(t[k<<1],t[(k<<1)+1]);}
int main()
{
    int n,m,k,i,j;
    n=read();m=read();
    for(i=0;i<=m;++i)v[0].push_back(INF);
    for(i=1;i<=n;++i)v[i].push_back(0);
    for(i=1;i<=n;++i)for(j=1;j<=m;++j)v[i].push_back(read());
    for(k=read(),i=0;i<k;++i)j=read(),q[read()].push_back(make_pair(j,i));
    memset(t,127,sizeof(t));
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)if(v[i][j]<v[i-1][j])change(j,i);
        for(j=0;j<q[i].size();++j)ans[q[i][j].second]=(t[1]<=q[i][j].first);
    }
    for(i=0;i<k;++i)puts(ans[i]?"Yes":"No");
}

e

n个环形,每个有a,b,h  如果bj<=b[i]&&b[j]>a[i] 那么可以把j叠到i上面  求最大的 西格玛 h

按照b排序,然后离散a,建线段树,加速dp就可以了。

这个是我写的...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 262144
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int n;
struct tower{
    int a,b,h;
}s[500005];
int l[500005];

ll T[2*N+5];

void renew(int x,ll ad)
{
    x+=N;T[x]=max(T[x],ad);
    for(x>>=1;x;x>>=1)
        T[x]=max(T[x<<1],T[(x<<1)+1]);
}

ll query(int l,int r)
{
    if(r==0) return 0;
    ll sum=0;
    for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1) sum=max(sum,T[l+1]);
        if( r&1) sum=max(sum,T[r-1]);
    }
    return sum;
}

bool cmp(tower x,tower y)
{
    return x.b>y.b||(x.b==y.b&&x.a>y.a);
}

int main()
{
   n=read();
   for(int i=1;i<=n;i++)
   {
       s[i].a=read();s[i].b=read();
       s[i].h=read();
       l[i<<1]=s[i].a;l[(i<<1)-1]=s[i].b;
   }
   sort(s+1,s+n+1,cmp);
   sort(l+1,l+n*2+1);
   int j=0;
   for(int i=1;i<=n*2;i++)
      if(l[i]!=l[i-1])
         l[++j]=l[i];
   for(int i=1;i<=n;i++)
   {
        s[i].a=lower_bound(l+1,l+j+1,s[i].a)-l;
        s[i].b=lower_bound(l+1,l+j+1,s[i].b)-l;
    }
   for(int i=1;i<=n;i++)
   {
        ll x=query(1,s[i].b-1);
        renew(s[i].a,x+(ll)s[i].h);
   }
   printf("%I64d\n",query(1,j));
   return 0;
}

当时的场景还原

我:您切c啊 我做一做ab

ditoly:吼吧

我去做a   瞬间卡壳了一下  然后打了个表

ditoly:这比赛有毒吧 一点都不照顾pascal选手

我:法克我a wa了(然后发现写错了一个字符)

ditoly:你在干什么啊(然后a了c)

我:我a掉b了  我d你e吧

ditoly:我d把,我乱写一个

我:我会e了,我去写一写。

(过了一下):woc 没开ll  wa了 这不稳健啊

ditoly:你干什么啊   我才是稳健选手啊(a了d)

调了调  我:貌似a大的排前面啊  交不交啊

ditoly:交啊 反正都被你弄成这样了 (wa了三次惨遭暴d)

我:哇 居然pp了  中毒啊啊啊

ditoly:哎(叹气)

我:我们去x人吧

ditoly:看了好久 没x点啊

我:我学到了很多姿势啊  比如贴一个不调用的筛法在上面做模板啊  还有 if(a==0) cout<<0; else if(a==1) cout<<1; 之类的姿势啊

ditoly:哈哈哈哈哈哈哈哈

最后:

ditoly:哎 两个人都打不过别人  这rank1是谁啊

同学:学军中学的许先有吧

我:害怕

感想:我好菜啊 ditoly无敌强

时间: 2024-10-20 03:42:52

Codeforces Round #401 (div.2)的相关文章

Codeforces Round #401 (Div. 2) E. Hanoi Factory

题目链接:Codeforces Round #401 (Div. 2) E. Hanoi Factory 题意: 给你n个环,每个环有内径a,外径b,高度v,现在让你将这n个环重起来,问你能重的最大高度. 满足条件:bi>=bj,bj>ai.(i<j) 题解: 首先将所以数据离散化,然后我们先按b从大到小排序,以a为第二关键字. 这里有一个贪心的思想,就是b相同时,a越小的放上面,这样可以重更多. 然后用树状数组维护一下放当前环的最大值,更新一下答案就行. 这题也可以直接cdq分治,不过

Codeforces Round #401 (Div. 2) E 贪心,线段树

Codeforces Round #401 (Div. 2) A 循环节 B 暴力排一下 C 标记出来,但10^5,特耿直地码了个O(n^2)的上去,最气的是在最后3分钟的时候被叉== D 从后往前贪心暴糙一下就好.比赛时一眼瞄出来了不敢写,搞不懂这样竟然不会超时.. E. Hanoi Factory 题意:n个环体,内径a[i],外径b[i],高h[i].当 a[i+1]<b[i]<=b[i+1] 时,第 i 个环体可以堆在第 i+1个环体上.求可以堆出的最高高度. tags:佩服那些大佬,

Codeforces Round #401 (Div. 2)解题报告

A - Shell Game 1 #include <iostream> 2 #include<bits/stdc++.h> 3 #include <stack> 4 #include <queue> 5 #include <map> 6 #include <set> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10

Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet

题目链接:C. Alyona and Spreadsheet 题意: 给你一个n*m的矩阵,现在有k个询问,每次给你一个l,r,问你在[l,r]这行中能否有一列数十非递减的顺序 题解: 用vector来保存矩阵. 对于每一行n*m dp一下最远能达到的范围,然后询问的时候就判断l,r是否在这个范围内. 1 #include<bits/stdc++.h> 2 #define pb push_back 3 #define rs m+1,r,rt<<1|1 4 #define mst(a

【贪心】Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

从后向前枚举字符串,然后从左向右枚举位. 如果该串的某位比之前的串的该位小,那么将之前的那串截断. 如果该串的某位比之前的串的该位大,那么之前那串可以直接保留全长度. 具体看代码. #include<cstdio> #include<iostream> #include<string> using namespace std; string a[500010]; int n,lens[500010],b[500010]; int main() { // freopen(

Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

题目链接:D. Cloud of Hashtags 题意: 给你n个字符串,让你删后缀,使得这些字符串按字典序排列,要求是删除的后缀最少 题解: 由于n比较大,我们可以将全部的字符串存在一个数组里面,然后记录一下每个字符串的开始位置和长度,然后从下面往上对比. 如果str[i][j]<str[i+1][j],直接退出,因为这里已经成为字典序. 如果str[i][j]>str[i+1][j],那么就把str[i][j]=0,表示从这里开始的后缀全部删掉. str[i][j]==str[i+1][

Codeforces Round #401 (Div. 2)C. Alyona and Spreadsheet(暴力)

传送门 Description During the lesson small girl Alyona works with one famous spreadsheet computer program and learns how to edit tables. Now she has a table filled with integers. The table consists of n rows and m columns. By ai, j we will denote the in

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i