老司机的奇怪noip模拟T1-guanyu

1. 关羽
(guanyu.cpp/c/pas )
【问题描述】
xpp 每天研究天文学研究哲学,对于人生又有一些我们完全无法理解的思考。
在某天无聊学术之后, xpp 打开了 http://web.sanguosha.com, 准备用他心爱的关羽虐
人。进入了八人身份局,作为一位主公,xpp 果断选了关羽,用关羽挑 7 人。
xpp 为什么喜欢关羽这个武将呢?因为武圣是个很牛逼的技能。
武圣——你可以将你的任意一张红桃或方片牌当杀使用或打出。
可见武圣这个技能如果用得好那么是可以轻松杀死别人的。 于是 xpp 把 7 个人全都轻松
干掉。
虽然 xpp 的武圣永远会横扫千军, 但是他想到了这样一个问题: 他应该先杀死谁后杀死
谁呢?
玩三国杀的人都是坐成一圈的, 每个人到牌堆的距离相等, 也就是说存在一个所有人都
在边界上的圆。作为主公,xpp 想怒杀 4 个反贼。根据他的推理,这一盘的情况应该是这样
的:4 个反贼所在的位置肯定构成一个矩形。现在,xpp 想知道,这一局可能有多少种反贼
的组合。
xpp 智商过于强大,不屑于想此等低端问题,然后你就要把这道题做出来。
【输入】
输入文件名为 guanyu.in。
第一行包含一个整数 n,表示除 xpp 外的游戏人数(不包括 xpp,他是主公)。
第二行包括 n 个整数,表示玩家之间的间隔弧长。
【输出】
输出文件名为 guanyu.out。
输出共 t 行,每行包括一个实数,表示所求的期望值。
【输入输出样例】
guanyu.in guanyu.out
8
1 2 2 3 1 1 3 3
3
【数据范围】
对于 30%的数据,n≤20。
对于 100%的数据,4≤n≤2000。

 ——————————————题解

我一个魏粉做蜀题真是不爽……这道题写的是奇怪n^2logn,就是枚举一条边,算它邻边,再算它对边,但是数组开小然后gg了,后来改大就过了

实际上答案是一个圆嘛……枚举两个点是否是直径然后等差数列算一算,n^2的

【数组开小毁一生】

【正确题解】

 1 #include <iostream>
 2 #include <string.h>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <algorithm>
 6 #include <cstring>
 7 #include <vector>
 8 #include <ctime>
 9 #define ivorysi
10 #define mo 10007
11 #define siji(i,x,y) for(int i=(x);i<=(y);i++)
12 #define gongzi(j,x,y) for(int j=(x);j>=(y);j--)
13 #define xiaosiji(i,x,y) for(int i=(x);i<(y);i++)
14 #define sigongzi(j,x,y) for(int j=(x);j>(y);j--)
15 #define ivory(i,x) for(int i=head[x];i;i=edge[i].next)
16 #define pii pair<int,int>
17 #define fi first
18 #define se second
19 #define inf 10000000
20 using namespace std;
21 typedef long long ll;
22 int a[4005],sum[4005],n,ans,po;
23 bool binary(int il,int ir,int val) {
24     int q=il-1;
25     while(il<ir) {
26         int mid=(il+ir+1)>>1;
27         if(sum[mid]-sum[q]<=val) il=mid;
28         else ir=mid-1;
29     }
30     if(sum[il]-sum[q]==val) {po=il;return true;}
31     else return false;
32 }
33 int main() {
34 #ifdef ivorysi
35     freopen("guanyu.in","r",stdin);
36     freopen("guanyu.out","w",stdout);
37 #else 
38     freopen("f1.in","r",stdin);
39 #endif
40     scanf("%d",&n);
41     siji(i,1,n) {
42         scanf("%d",&a[i]);
43         sum[i]=sum[i-1]+a[i];
44     }
45     siji(i,1,n) {
46         a[n+i]=a[i];
47         sum[n+i]=sum[n+i-1]+a[n+i];
48     }
49     siji(i,1,n) {
50         xiaosiji(j,0,n) {
51             int tmp=sum[j+i]-sum[i-1];
52             if(tmp*2>=sum[n]) continue;
53             int tmp2=(sum[n]-tmp*2)/2;
54             if(!binary(i+j+1,i+n-1,tmp2)) continue;
55             if(!binary(po+1,i+n-1,tmp)) continue;
56             ++ans;
57 
58         }
59     }
60     printf("%d\n",ans/4);
61 }

 

posted @ 2016-09-10 23:10  sigongzi  阅读(416)  评论(0编辑  收藏  举报