真的长时间不打cf手就生了,呜呜呜。
现在已经定下了大致的策略了,所以发誓非必要不跳任何一场cf的比赛。(必要的定义是:我想怎么定义就怎么定义.....)
先看这场吧,就写了三道题,....,写完C后,就剩10几分钟了,也来不及写了...发现简单题还是要提速的,不然真的后面的题都没时间写了。
第一题就是一道简单的构造题,给定一个n*n的棋盘,往上面放棋子,每个棋子可以攻击到他所在行,所在列的所有网格中的棋子,问给定k个棋子,能不能构造出一种方案,使得任意一个棋子在移动一步后仍是互相不影响的。
这种构造很简单就是依次往(1,1),(3,3),...,这样一直放下去就行。
b题卡了很久,简化题意:给定你n个区间,每个区间有相应的价格,问当依次给定前i个区间时(i=1,2,...,n),覆盖最多数字的最小代价是多少?这里覆盖的定义是你选定的区间的最左端点到最右端点之间的所有数都被覆盖。
首先观察题意可以发现覆盖的个数只和左右端点有关。所以可以肯定的是我们选择的区间最多有两个。一个要求它的左端点足够小,一个要求它的右端点足够大,同时还有可能出现一个区间的情况。我们维护最左端点,最右端点,再来个一个区间的情况即可。
#include<bits/stdc++.h> #define ll long long using namespace std; struct tree { int l,r,c; }a[100010]; int main() { // freopen("2.in","r",stdin); int T;scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].c); int lid=0,rid=0,id=0; for(int i=1;i<=n;++i) { bool fa=0; int cs=0; if(lid==0&&rid==0) { lid=i;rid=i; id=i; cs=a[i].c; } else { if(a[i].l<a[lid].l) lid=i,fa=1; if(a[i].l==a[lid].l&&a[i].c<a[lid].c) lid=i; if(a[i].r>a[rid].r) rid=i,fa=1; if(a[i].r==a[rid].r&&a[i].c<a[rid].c) rid=i; if(a[i].l<a[id].l||a[i].r>a[id].r||a[i].l==a[id].l&&a[i].r==a[id].r&&a[i].c<a[id].c) id=i; int d=a[lid].c+a[rid].c; if(lid==rid) d/=2; if(a[id].l==a[lid].l&&a[id].r==a[rid].r) cs=min(d,a[id].c); else cs=d; } printf("%d\n",cs); } } return 0; }
再来看c题,第一道交互题,也是现学现做的。
这种轮换的题,我们可以通过建图的方式,发现他就是一个循环,通过某一个位置的数字就是循环的所有数字,我们找到这个循环,暴力做就行了。
#include<bits/stdc++.h> #define ll long long using namespace std; struct tree { int l,r,c; }a[100010]; int main() { // freopen("2.in","r",stdin); int T;scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].c); int lid=0,rid=0,id=0; for(int i=1;i<=n;++i) { bool fa=0; int cs=0; if(lid==0&&rid==0) { lid=i;rid=i; id=i; cs=a[i].c; } else { if(a[i].l<a[lid].l) lid=i,fa=1; if(a[i].l==a[lid].l&&a[i].c<a[lid].c) lid=i; if(a[i].r>a[rid].r) rid=i,fa=1; if(a[i].r==a[rid].r&&a[i].c<a[rid].c) rid=i; if(a[i].l<a[id].l||a[i].r>a[id].r||a[i].l==a[id].l&&a[i].r==a[id].r&&a[i].c<a[id].c) id=i; int d=a[lid].c+a[rid].c; if(lid==rid) d/=2; if(a[id].l==a[lid].l&&a[id].r==a[rid].r) cs=min(d,a[id].c); else cs=d; } printf("%d\n",cs); } } return 0; }