QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#609574 | #9417. Palindromic Polygon | Kanate# | WA | 2ms | 11852kb | C++14 | 3.1kb | 2024-10-04 13:27:53 | 2024-10-04 13:27:59 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rint int
#define endl '\n'
#define uint unsigned long long
void debug(int *a,int n){for(rint i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;}
void debug(int *a){for(rint i=1;a[i];i++) cout<<a[i]<<" ";cout<<endl;}
void debug(int x){cout<<"debug: "<<x<<endl;}
int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c))x=x*10+c-48,c=getchar();
return x*f;
}const int N=1010,p=1e9,mod=998244353;
int n,a[N],cnt,b[N],nxt[N][N],pre[N][N];
struct Point{
int x,y;
Point operator-(const Point &A)const{return {x-A.x,y-A.y};}
int operator^(const Point &A)const{return abs(x*A.y-y*A.x);}
}P[N];
inline Point adjus(int x,int y){
swap(x,y);
if(x>n) x-=n;
if(y<x) y+=n;
return {x,y};
}
inline int cal(int x,int y,int z,int k)
{
// puts("cal");
return ((P[x]-P[y])^(P[x]-P[k]))+((P[z]-P[y])^(P[z]-P[k]));
}
inline int cal(int x,int y,int k)
{
// puts("cal");
return ((P[x]-P[y])^(P[x]-P[k]));
}
int dfs(int l,int r);
int bfs(int l,int r);
int f[N][N];
int dfs(int l,int r)
{
if(f[l][r]!=-1) return f[l][r];
int res=0;
// for(rint k=1;k<=cnt;k++)
// {
// const int i=nxt[l][k],j=pre[r][k];
// if(i<j) res=max(res,dfs(i,j)+cal(l,i,j,r));
// }
// for(rint i=l+1;i<r;i++)
// for(rint j=i+1;j<r;j++)
// if(a[i]==a[j])
// res=max(res,dfs(i,j)+cal(l,i,j,r));
for(rint i=l+1;i<r;i++)
res=max(res,bfs(i,r)+cal(l,i,r));
return f[l][r]=res;
}
int g[N][N];
int bfs(int l,int r)
{
if(g[l][r]!=-1) return g[l][r];
int res=0;
for(rint i=l+1;i<r;i++)
if(a[i]==a[l])
res=max(res,dfs(i,l)+cal(l,i,r));
return g[l][r]=res;
}
void Work()
{
n=read(),cnt=0;
for(rint i=1;i<=n;i++) a[i]=a[i+n]=read(),b[++cnt]=a[i];
sort(b+1,b+cnt+1);
cnt=unique(b+1,b+cnt+1)-b-1;
for(rint i=1;i<=n<<1;i++) a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
static int c[N];
for(rint i=1;i<=cnt;i++) c[i]=n*2+1;
for(rint i=n<<1;i;i--)
{
for(rint j=1;j<=cnt;j++) nxt[i][j]=c[j];
c[a[i]]=i;
}
for(rint i=1;i<=cnt;i++) c[i]=0;
for(rint i=1;i<=n<<1;i++)
{
for(rint j=1;j<=cnt;j++) pre[i][j]=c[j];
c[a[i]]=i;
}
for(rint i=1;i<=n;i++) P[i]=P[i+n]={read(),read()};
for(rint i=0;i<=n*2;i++)
for(rint j=0;j<=n*2;j++) f[i][j]=g[i][j]=-1;
// memset(f,-1,sizeof f);
int ans=0;
for(rint i=1;i<=n;i++)
for(rint j=i+1;j<i+n;j++)
if(a[i]==a[j])
{
// cout<<i<<" "<<j<<" "<<dfs(i,j)<<endl;
ans=max(ans,dfs(i,j));
}
for(rint i=1;i<=n;i++)
for(rint j=i+1;j<i+n;j++)
if(a[i]==a[j])
assert(P[i].x==P[adjus(i,j).y].x),
assert(P[i].y==P[adjus(i,j).y].y),
assert(P[j].x==P[adjus(i,j).x].x),
assert(P[j].y==P[adjus(i,j).x].y);
for(rint i=1;i<=n;i++)
for(rint j=i+1;j<i+n;j++)
if(a[i]==a[j])
for(rint k=i+1;k<j;k++)
ans=max(ans,cal(i,j,k)+dfs(adjus(i,j).x,adjus(i,j).y));
cout<<ans<<endl;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
#else
#endif
// int T=1;
int T=read();
while(T--) Work();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 9912kb
input:
3 8 2 4 2 4 3 4 5 3 2 3 0 6 -3 3 -3 0 -2 -3 1 -5 3 -3 4 0 3 1 2 3 0 0 1 0 0 1 3 1 1 1 0 0 1 0 0 1
output:
84 0 1
result:
ok 3 number(s): "84 0 1"
Test #2:
score: 0
Accepted
time: 2ms
memory: 11852kb
input:
1 4 1000000000 1000000000 1000000000 1000000000 -1000000000 -1000000000 1000000000 -1000000000 1000000000 1000000000 -1000000000 1000000000
output:
8000000000000000000
result:
ok 1 number(s): "8000000000000000000"
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 9844kb
input:
129 10 604040473 604040473 287094217 682965575 70435786 287094217 604040473 287094217 682965575 92620053 -193 -184 -200 -200 -125 -169 -120 -157 -120 -145 -124 -139 -137 -136 -155 -149 -172 -163 -187 -177 5 346787871 346787871 113397429 113397429 346787871 -173 -181 -186 -166 -200 -195 -194 -200 -17...
output:
3857 1068 1516 522 2529 3529 1165 3468 629 925 3423 708 3617 1746 2778 1987 630 2221 1130 4677 1900 1646 597 329 3029 6400 1070 3045 1061 765 142 2805 1589 8464 2002 395 1744 2366 1357 480 2094 5119 5001 2446 3922 2249 3924 4550 2123 1473 3152 1950 1990 1609 3367 1991 1459 3788 2617 2298 4048 356 69...
result:
wrong answer 3rd numbers differ - expected: '877', found: '1516'