delete pics to save space

This commit is contained in:
2023-08-03 09:22:52 +08:00
commit de60cd6ed4
1334 changed files with 66221 additions and 0 deletions

94
p.CH1812.cpp Normal file
View File

@ -0,0 +1,94 @@
//http://contest-hunter.org:83/contest/0x18%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%8D%E7%BB%83%E4%B9%A0/1812%20%E7%94%9F%E6%97%A5%E7%A4%BC%E7%89%A9
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,m,a[maxn];
void Init()
{
int tot=1,i=0; static int b[maxn];
while(i<n&&a[i]<0) i++;
if(i==n) { tot=0; return; }
b[0]=a[i]; i++;
for(;i<n;i++)
{
if((long long)a[i]*b[tot-1]>0) b[tot-1]+=a[i];
else b[tot++]=a[i];
}
n=tot;
for(int i=0;i<n;i++) a[i]=b[i];
if(a[n-1]<0) n--;
}
struct Node
{
int val; bool alive;
Node *pre,*nxt;
};
struct Data
{
int val; Node *p;
};
priority_queue<Data> Q;
inline bool operator<(const Data &a,const Data &b) { return a.val>b.val; }
Node mem[maxn],*mcnt=mem,*head,*tail,*p;
inline Node* InsertAfter(Node *p,int val)
{
mcnt->val=val; mcnt->alive=true;
mcnt->pre=p; mcnt->nxt=p->nxt;
mcnt->nxt->pre=mcnt; mcnt->pre->nxt=mcnt;
Q.push((Data){abs(val),mcnt});
// printf("insert %d\n",abs(val));
return mcnt++;
}
inline void Erase(Node *p)
{
p->alive=false;
p->pre->nxt=p->nxt;
p->nxt->pre=p->pre;
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
freopen("pro.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0) { n--; i--; }
}
Init();
if(n==0||m==0) { puts("0"); return 0; }
head=mcnt++; tail=mcnt++; head->nxt=tail; tail->pre=head; p=head;
for(int i=0;i<n;i++)
{
p=InsertAfter(p,a[i]);
// printf("%d : %d\n",i+1,a[i]);
}
p=head->nxt;
while(n/2+1>m)
{
// printf("n=%d\n",n);
Data u;
while(u=Q.top(),Q.pop(),!u.p->alive);
// printf("choose %d\n",u.p->val);
if(u.p==head->nxt) { Erase(u.p->nxt); Erase(u.p); }
else if(u.p==tail->pre) { Erase(u.p->pre); Erase(u.p); }
else
{
u.p->val += u.p->pre->val + u.p->nxt->val;
Erase(u.p->pre); Erase(u.p->nxt);
Q.push((Data){abs(u.p->val),u.p});
// printf("have %d new!\n",u.p->val);
}
n-=2;
}
int res=0;
p=head->nxt;
while(p!=tail) { res+=p->val>0?p->val:0; p=p->nxt; }
printf("%d\n",res);
return 0;
}