多校联考4
rank:151 mark:60
总之,考的很差劲,再接再厉!!!
题纲:
T1:思维+贪心思想
T2:三分求三分函数答案+数形结合证明单调性
T3:manacher求最长回文串+线段覆盖问题(最少线段完全覆盖)
T4:贪心+归并思想(或者dijstra思想)
T1:
有n个堡垒需要攻打,攻打每个堡垒需要x个士兵,y个会阵亡,没阵亡的可以去攻打其他堡垒,问最少派遣的士兵数量
贪心,按照x-y排个序,剩的多的排前面
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<string> #include<cstdlib> #include<ctime> #include<algorithm> #include<iomanip> #include<bitset> #include<map> #include<queue> #include<deque> #include<vector> #define _f(i,a,b) for(register int i=a;i<=b;++i) #define f_(i,a,b) for(register int i=a;i>=b;--i) #define ll long long #define INF 1000000000 #define chu printf //太大会炸 using namespace std; inline ll re() { ll x = 0, f = 1; char ch = getchar(); while(ch > '9' || ch < '0') { if(ch == '-') { f = -1; } ch = getchar(); } while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch^48); ch = getchar(); } return x * f; } const int N=100000+100; ll t,n; struct node { ll a,b,c; }e[N]; int a[N]; bool cmp(node aa,node bb) { return aa.c>bb.c; } inline ll getans() { ll ans=e[1].b;ll tmp=0; _f(i,2,n) { if(e[i].b-(e[i-1].c+tmp)<0)//如果给的太多了 { tmp+=e[i-1].c-e[i].b;//剩下的备用 } else { ans+=(e[i].b-e[i-1].c-tmp); tmp=0; } } return ans; } int main() { // freopen("a.txt","r",stdin); // freoepn("","w",stdout); t=re(); _f(t_p,1,t) { n=re(); _f(i,1,n)e[i].a=re(),e[i].b=re(),e[i].c=e[i].b-e[i].a,a[i]=i; sort(e+1,e+1+n,cmp); ll anse=getans(); chu("%lld\n",anse); } return 0; } /* 2 2 4 7 1 5 3 1 4 4 6 3 5 1 2 4 7 1 5 1 4 4 7 1 1 3 5 4 6 1 9 460466601 802805961 104273261 108738217 102351381 411885879 296029105 952513369 604571752 911815892 790909345 796548981 430391828 512531288 169930216 375266439 276432564 774360399 */
T2
定义一个数列虚弱程度是子序列(mx-mi)的最大值,(取绝对值),让这个数列同时减去一个数,使得虚弱程度最小
三分