2021-team4-C014
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
A k==2 没有判 卡了好久
H 读入反了 最后才发现
F 还不知道哪里错了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 120050
#define MO 998244353
long double O,_O;
int a,b,t,O2[N],O3[N],p2[N],p3[N],n,T,Ans,_Ans,t2,t3;
#define D 25
struct node {
int a, b;
bool operator < (const node&g)const{
if(b!=g.b)return b>g.b;
return a>g.a;
}
}A2[N],A3[N];
inline void upd(int &a, int b)
{
a+=b;
a%=MO;
}
void cal()
{
int u2,u3;u2=u3=1;
for(int i=1;i<n;++i){
while(O2[u2]) ++u2;
while(O3[u3]) ++u3;
int op=n-i;
int fl=0;
if(n-i+1 <= D+3){
fl=1;
}
if(u3>t3){
upd(Ans,(long long)A2[u2].b*p2[op]%MO);
if(fl)O+=(long double)A2[u2].b*pow(2,op);
++u2;
continue;
}
if(u2>t2){
upd(Ans,(long long)A3[u3].b*p3[op]%MO);
if(fl)O+=(long double)A3[u3].b*pow(3,op);
++u3;
continue;
}
if(n-i+1 >= D) {
upd(Ans,(long long)A3[u3].b*p3[op]%MO);
if(fl)O+=(long double)A3[u3].b*pow(3,op);
++u3;
continue;
}
if(pow(2,n-i)*A2[u2].b > pow(3,n-i)*A3[u3].b){
upd(Ans,(long long)A2[u2].b*p2[op]%MO);
if(fl)O+=(long double)A2[u2].b*pow(2,op);
++u2;
} else {
upd(Ans,(long long)A3[u3].b*p3[op]%MO);
if(fl)O+=(long double)A3[u3].b*pow(3,op);
++u3;
}
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
p2[0]=1;p3[0]=1;
for(int i=1;i<=100500;++i){
p2[i]=(long long)p2[i-1]*2%MO;
p3[i]=(long long)p3[i-1]*3%MO;
}
cin >> T;
while(T--){
cin >> n; t2=t3=0;
for(int i=1;i<=n;++i){
cin >> a >> b >> t;
if(t ==2 )A2[++t2].a=a,A2[t2].b=b;
else A3[++t3].a=a,A3[t3].b=b;
}
sort(A2+1,A2+t2+1); // ->xiao
sort(A3+1,A3+t3+1);
_O=0; _Ans=0;
//u2
for(int i=max(t2-D,1ll);i<=t2;++i){
O2[i]=1;
O = A2[i].a;
Ans=A2[i].a;
cal();
if(O > _O){
_O=O;
_Ans=Ans;
}
O2[i]=0;
}
//u3
for(int i=max(t3-(D-t2)+1,1ll);i<=t3;++i){
O3[i]=1;
O = A3[i].a;
Ans=A3[i].a;
cal();
if(O > _O){
_O=O;
_Ans=Ans;
}
O3[i]=0;
}
if(T)cout<<_Ans<<'\n';
else cout<<_Ans;
}
}
/*
1
3
1 1 2
2 2 2
1 1 3
*/
A k==2 没有判 卡了好久
H 读入反了 最后才发现
F 还不知道哪里错了
#include
using namespace std;
#define int long long
#define N 120050
#define MO 998244353
long double O,_O;
int a,b,t,O2[N],O3[N],p2[N],p3[N],n,T,Ans,_Ans,t2,t3;
#define D 25
struct node {
int a, b;
bool operator < (const node&g)const{
if(b!=g.b)return b>g.b;
return a>g.a;
}
}A2[N],A3[N];
inline void upd(int &a, int b)
{
a+=b;
a%=MO;
}
void cal()
{
int u2,u3;u2=u3=1;
for(int i=1;i while(O2[u2]) ++u2; while(O3[u3]) ++u3; int op=n-i; int fl=0; if(n-i+1 <= D+3){ fl=1; } if(u3>t3){ upd(Ans,(long long)A2[u2].b*p2[op]%MO); if(fl)O+=(long double)A2[u2].b*pow(2,op); ++u2; continue; } if(u2>t2){ upd(Ans,(long long)A3[u3].b*p3[op]%MO); if(fl)O+=(long double)A3[u3].b*pow(3,op); ++u3; continue; } if(n-i+1 >= D) { upd(Ans,(long long)A3[u3].b*p3[op]%MO); if(fl)O+=(long double)A3[u3].b*pow(3,op); ++u3; continue; } if(pow(2,n-i)*A2[u2].b > pow(3,n-i)*A3[u3].b){ upd(Ans,(long long)A2[u2].b*p2[op]%MO); if(fl)O+=(long double)A2[u2].b*pow(2,op); ++u2; } else { upd(Ans,(long long)A3[u3].b*p3[op]%MO); if(fl)O+=(long double)A3[u3].b*pow(3,op); ++u3; } } } signed main() { cin.tie(0)->sync_with_stdio(0); p2[0]=1;p3[0]=1; for(int i=1;i<=100500;++i){ p2[i]=(long long)p2[i-1]*2%MO; p3[i]=(long long)p3[i-1]*3%MO; } cin >> T; while(T--){ cin >> n; t2=t3=0; for(int i=1;i<=n;++i){ cin >> a >> b >> t; if(t ==2 )A2[++t2].a=a,A2[t2].b=b; else A3[++t3].a=a,A3[t3].b=b; } sort(A2+1,A2+t2+1); // ->xiao sort(A3+1,A3+t3+1); _O=0; _Ans=0; //u2 for(int i=max(t2-D,1ll);i<=t2;++i){ O2[i]=1; O = A2[i].a; Ans=A2[i].a; cal(); if(O > _O){ _O=O; _Ans=Ans; } O2[i]=0; } //u3 for(int i=max(t3-(D-t2)+1,1ll);i<=t3;++i){ O3[i]=1; O = A3[i].a; Ans=A3[i].a; cal(); if(O > _O){ _O=O; _Ans=Ans; } O3[i]=0; } if(T)cout<<_Ans<<'\n'; else cout<<_Ans; } } /* 1 3 1 1 2 2 2 2 1 1 3 */