1. 程式人生 > >HDU 4334(思維+二分答案)

HDU 4334(思維+二分答案)

傳送門

題面:

Trouble

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6560    Accepted Submission(s): 1847


Problem DescriptionHassan is in trouble. His mathematics teacher has given him a very difficult problem called 5-sum. Please help him.
The 5-sum problem is defined as follows: Given 5 sets S_1,...,S_5 of n integer numbers each, is there a_1 in S_1,...,a_5 in S_5 such that a_1+...+a_5=0?
InputFirst line of input contains a single integer N (1≤N≤50). N test-cases follow. First line of each test-case contains a single integer n (1<=n<=200). 5 lines follow each containing n integer numbers in range [-10^15, 1 0^15]. I-th line denotes set S_i for 1<=i<=5.
OutputFor each test-case output "Yes" (without quotes) if there are a_1 in S_1,...,a_5 in S_5 such that a_1+...+a_5=0, otherwise output "No".
Sample Input221 -11 -11 -11 -11 -131 2 3-1 -2 -34 5 6-1 3 2-4 -10 -1
Sample OutputNoYes
Source    題目描述:有5個集合,每個集合有n個數,問你從每個集合中取出一個數,取出的五個數的和能否為0。
    題目分析:試著分析下這道題的時間複雜度。如果我們暴力去解題的話,時間複雜度為N*n^5,故極限時間必定超過1e9。故大暴力是絕對不可行的。    而因為題目讓我們求五個數的和,因此我們可以適當進行拆分。    我們可以先使前兩個集合求和,第3、4集合求和,並將這兩個新的集合排序,此時,對於最後一個集合,我們就可以通過二分答案的方法去查詢是否存在解。    因為新集合A和新集合B是具有單調性的,因此,我們只需要先從頭開始對集合5進行列舉,同時對新集合A進行列舉,最後再對新集合B從最後開始列舉,根據單調性,如果滿足e[i]+A[j]+B[k]>0則令B的下標-1,直到滿足小於或者等於停止。(等於0則輸出yes即可)
    ps:這一題事實上是hdu-1895的簡化版,在hdu1895這題中還要求求出滿足等於0的個數。    具體看程式碼:
#include <bits/stdc++.h>
#define maxn 2550
using namespace std;
typedef long long ll;
ll a[maxn],b[maxn],c[maxn],d[maxn],e[maxn];
vector<ll>tmp1,tmp2,tmp3;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        tmp1.clear(),tmp2.clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
        for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
        for(int i=1;i<=n;i++) scanf("%lld",&d[i]);
        for(int i=1;i<=n;i++) scanf("%lld",&e[i]);

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                tmp1.push_back(a[i]+b[j]);
                tmp2.push_back(c[i]+d[j]);
            }
        }
        sort(tmp1.begin(),tmp1.end());
        sort(tmp2.begin(),tmp2.end());
        bool vis=true;
        for(int i=1;i<=n;i++){
            int p=tmp2.size()-1;
            for(int j=0;j<tmp1.size()&&p>=0;j++){
                while(e[i]+tmp1[j]+tmp2[p]>0) p--;
                if(e[i]+tmp1[j]+tmp2[p]==0){
                    vis=false;
                    puts("Yes");
                    break;
                }
            }
            if(!vis) break;
        }
        if(vis) puts("No");
    }
    return 0;
}

相關推薦

HDU 4334思維+二分答案

傳送門題面:TroubleTime Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6560    Accepted Sub

POJ2110 Moutain WalkingBFS+二分答案

【題目分析】 要讓路徑上最大最小差最小(繞口令~),很明顯,二分答案即可。 關鍵在於check函式怎麼寫:首先我們確定上下界,但如果我們去二分差值,好像沒有辦法在短時間內檢驗,所以我們去二分這個上界,列舉下界,再帶入圖中檢驗。 我們發現最大的高度也不會超過110,所

HDU 3081 Marriage Match II網絡流+並查集+二分答案

you 集合 more cst ott next friends nic problem 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 題目: Problem Description Presumably, y

HDU 3943 —— K-th Nya Number數位DP,二分答案

給定X和Y的值,一個數字用十進位制表示,對於數位4出現恰好X次,7恰好Y次的數字稱為nya數。 然後給P和Q, 後面是一系列查詢, 每個查詢K就是在區間(P,Q]上找到第K個nya數,不存在則輸出Nya!(= = 這是尖叫的意思麼) 因為數字的範圍比較大,又是跟數位有關,

[HDU 4334] Trouble 分治+二分查詢

HDU - 4334 給你五個陣列,每組 N個元素 (N<=200) 問是否能在五個數組裡各選一個數,使得和為0 思路是分治,然後再二分查詢,降低複雜度 1) 算出 S1和 S2所有元素的

505. 城市二分答案

正整數 tin dijkstra 格式 def 優化 nbsp urn 一行 505. 城市 ★★ 輸入文件:cost.in 輸出文件:cost.out 簡單對比時間限制:1 s 內存限制:128 MB 【題目描述】在某個遙遠的國家裏,有n個城市。編

P2183 巧克力二分答案

for using clas 小s input int out art ace P2183 巧克力 題目描述 佳佳邀請了M個同學到家裏玩。為了招待客人,她需要將巧克力分給她的好朋友們。她有N(1<=N<=5000)塊巧克力,但

hdu 6161--Big binary tree思維--壓縮空間

style ons desc stream 我們 value chan 向上 while 題目鏈接 Problem Description You are given a complete binary tree with n nodes. The root no

[Bzoj1821][JSOI2010]Group 部落劃分 Group並查集二分答案

ble 輸出 content 有意 表示 com 自己 clu 我們 1821: [JSOI2010]Group 部落劃分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2949 Solved:

「CodePlus 2017 11 月賽」汀博爾 二分答案

sca https min fix type namespace 題意 滿足 fontsize 題目鏈接:https://loj.ac/problem/6249 題意:有 n 棵樹,初始時每棵樹的高度為 H?i?,第 i 棵樹每月都會長高 A?i??。現在有個木料長度總量

BZOJ3998 TJOI2015弦論後綴數組+二分答案

print eof read 二分 否則 二分答案 scan out close 先看t=1的情況。顯然得求出SA(因為我不會SAM)。我們一位位地確定答案。設填到了第len位,二分這一位填什麽之後,在已經確定的答案所在的範圍(SA上的某段區間)內二分,找到最後一個小於當前

BZOJ-1816: [Cqoi2010]撲克牌二分答案

ont printf span put esc 輸出 i++ enter fine 1816: [Cqoi2010]撲克牌 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2640 Solved: 1046[Submit][

CF1066D Boxes Packing二分答案

return pre 就是 當前 scan () 二分答案 amp iostream 題意描述: 你有$n$個物品,每個物品大小為$a_i$,$m$個盒子,每個盒子的容積為$k$。$Maksim$先生想把物品裝入盒子中。對於每個物品,如果能被放入當前的盒子中,則放入當前盒

BZOJ4590 SHOI2015自動刷題機二分答案

  二分答案,分別往儘量小的和儘量大的二分即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #includ

IOI 2010 Quality of Living二分答案

題意 給定一個 R × C R

【codevs3119】高精度開根號二分答案

problem 高精度開根號 輸入一個數 求平方根 solution 二分答案,如果mid*mid>原數就去找更小的,反之找更大的。 精度小於二忽略不計? 用到高精加,高精乘,加低精,除低精,比較大小這幾個。 放棄除錯,

HDU-4705 Y思維+dfs樹

Input 4 1 2 1 3 1 4 Output 1 題意:給你一顆樹,選擇一個三個點構成的集合,使得這三個點不在一條直線上(意思就是 從一個點出發,用一條不回頭的線不能將這三個點連起來)問一共有多少個這樣的集合   思路 :先求出一共有多少個集合,就是

ZOJ 4062 Plants vs. Zombies二分答案

題目連結:Plants vs. Zombies 題意:從1到n每個位置一棵植物,植物每澆水一次,增加ai高度。人的初始位置為0,人每次能往左或往右走一步,走到哪個位置就澆水一次。求m步走完後最低高度的植物最大高度為多少。 題解:明顯二分答案的題目。check時從左往右遍歷,貪心思路:把該位置滿足同時給後面

【爬山】【hdu薛貓貓001】思維水題

題目:   Problem Description 小Z準備去爬山,在他的面前有N座山,每座山都有對應的高度。他想選擇兩座高度差最小的山進行攀爬。但由於好多山之間的高度差可能是相同的,所以他需要你告訴他高度差最小的兩座山的高度差是多少以及有多少種不同的選取方式(選取山A、B

Codeforces 1077D Cutting Out二分答案

題目連結:Cutting Out 題意:給定一個n長度的數字序列s,要求得到一個k長度的數字序列t,每次從s序列中刪掉完整的序列t,求出能刪次數最多的那個數字序列t。 題解:數字序列s先轉換成不重複的數字序列,並記錄各個數字重複的次數,然後按照重複次數從大到小排序。二分最大刪除次數,最後再輸出對應的序列t