zoukankan      html  css  js  c++  java
  • hihocoder 1388 &&2016 ACM/ICPC Asia Regional Beijing Online Periodic Signal

    #1388 : Periodic Signal

    时间限制:5000ms
    单点时限:5000ms
    内存限制:256MB

    描述

    Profess X is an expert in signal processing. He has a device which can send a particular 1 second signal repeatedly. The signal is A0 ... An-1 under n Hz sampling.

    One day, the device fell on the ground accidentally. Profess X wanted to check whether the device can still work properly. So he ran another n Hz sampling to the fallen device and got B0 ... Bn-1.

    To compare two periodic signals, Profess X define the DIFFERENCE of signal A and B as follow:

    You may assume that two signals are the same if their DIFFERENCE is small enough.
    Profess X is too busy to calculate this value. So the calculation is on you.

    输入

    The first line contains a single integer T, indicating the number of test cases.

    In each test case, the first line contains an integer n. The second line contains n integers, A0 ... An-1. The third line contains n integers, B0 ... Bn-1.

    T≤40 including several small test cases and no more than 4 large test cases.

    For small test cases, 0<n≤6⋅103.

    For large test cases, 0<n≤6⋅104.

    For all test cases, 0≤Ai,Bi<220.

    输出

    For each test case, print the answer in a single line.

    样例输入
    2
    9
    3 0 1 4 1 5 9 2 6
    5 3 5 8 9 7 9 3 2
    5
    1 2 3 4 5
    2 3 4 5 1
    样例输出
    80
    0
    这题啊,我觉得暴力可做,刚开始超时了,又做了一点优化还是不行啊。
    然后我觉得这个k的取值,和排完序的前m项有很大的关系,然后取m在不超时和wa的范围之间。。。这个看运气
    ,竟然AC了
    我的思路是排序a, b数组,按住其中一个数组不动,在前m个数内,用a1的下标减去b的下标,取一个得到k的最大值就好
    正规做法竟然是fft。。不会啊
    我的方法是歪门邪道。。看看就好,不要采纳
      1 #include <iostream>
      2 #include <sstream>
      3 #include <fstream>
      4 #include <string>
      5 #include <vector>
      6 #include <deque>
      7 #include <queue>
      8 #include <stack>
      9 #include <set>
     10 #include <map>
     11 #include <algorithm>
     12 #include <functional>
     13 #include <utility>
     14 #include <bitset>
     15 #include <cmath>
     16 #include <cstdlib>
     17 #include <ctime>
     18 #include <cstdio>
     19 #include <cstring>
     20 #define FOR(i, a, b)  for(int i = (a); i <= (b); i++)
     21 #define RE(i, n) FOR(i, 1, n)
     22 #define FORP(i, a, b) for(int i = (a); i >= (b); i--)
     23 #define REP(i, n) for(int i = 0; i <(n); ++i)
     24 #define SZ(x) ((int)(x).size )
     25 #define ALL(x) (x).begin(), (x.end())
     26 #define MSET(a, x) memset(a, x, sizeof(a))
     27 using namespace std;
     28 
     29 
     30 typedef long long int ll;
     31 typedef pair<int, int> P;
     32 ll read() {
     33     ll x=0,f=1;
     34     char ch=getchar();
     35     while(ch<'0'||ch>'9') {
     36         if(ch=='-')f=-1;
     37         ch=getchar();
     38     }
     39     while(ch>='0'&&ch<='9') {
     40         x=x*10+ch-'0';
     41         ch=getchar();
     42     }
     43     return x*f;
     44 }
     45 const double pi=3.14159265358979323846264338327950288L;
     46 const double eps=1e-6;
     47 const int mod = 1e9 + 7;
     48 const int INF = 0x3f3f3f3f;
     49 const int MAXN = 1005;
     50 const int xi[] = {0, 0, 1, -1};
     51 const int yi[] = {1, -1, 0, 0};
     52 
     53 int N, T;
     54 ll a[120002], b[120002];
     55 ll c[60002], d[60002];
     56 struct asort {
     57     int num;
     58     ll date;
     59 } sa[60002], sb[60002];
     60 bool cmp(asort a, asort b) {
     61     return a.date > b.date;
     62 }
     63 int main() {
     64     //freopen("in.txt", "r", stdin);
     65     int t, n, k;
     66     scanf("%d", &t);
     67 
     68     while(t--) {
     69         ll sum = 0;
     70         scanf("%d", &n);
     71 
     72         for(int i = 0; i < n; i++) a[i] = read();
     73         for(int i = 0; i < n; i++) b[i] = read();
     74         for(int i = n; i < 2*n ; i++) {
     75             a[i] = a[i-n];
     76             b[i] = b[i-n];
     77         }
     78         for(int i = 0; i < n; i++) {
     79             sum += a[i]*a[i];
     80             sum += b[i]*b[i];
     81             sa[i].num = i, sa[i].date = a[i];
     82             sb[i].num = i, sb[i].date = b[i];
     83         }
     84         sort(sa, sa+n, cmp);
     85         sort(sb, sb+n, cmp);
     86         int m = min(n, 10000);
     87         ll res = 0;
     88         for(int ai = 0; ai < m; ai++) {
     89             ll ans = 0;
     90             int i = (sb[0].num - sa[ai].num + n)%n;
     91             for(int j = i; j < n+i; j++) {
     92                 ans += (a[j-i]*b[j]) <<1;
     93             }
     94             if(ans > res) {
     95                 res = ans;
     96                 k = i;
     97             }
     98         }
     99         printf("%lld
    ", sum - res);
    100         //  printf("%d
    ", k);
    101     }
    102     return 0;
    103 }
     
  • 相关阅读:
    C#延时
    Java Applet 绘图
    C#调用ActiveX控件异常处理
    J2SE连连看
    基于对象的棋类程序结构设计
    MATLAB应用专题part2电力电子仿真技术
    MATLAB应用专题part1电力电子仿真技术
    硬件知识整理part2电阻在反馈网络中的应用
    C语言再学习part1宏观认识C语言
    C语言再学习part3—算法
  • 原文地址:https://www.cnblogs.com/cshg/p/5905398.html
Copyright © 2011-2022 走看看