1. 程式人生 > >CSU 1343: Long Long

CSU 1343: Long Long

題目:

Description

    現在有兩個單調遞增序列,第一個序列有N個整數,第二個序列有M個整數,現在你可以從第一個序列中選一個數x,然後從第二個序列中選一個數y,那麼有多少種情況滿足x+y<=K呢?

Input

    輸入包含多組資料。
    對於每組測試資料,第一行包含兩個整數NM , K (1 <= NM <= 105, 1 <= K <= 109),含義同上。接下來一行包含N個在[1, 109]範圍內的整數,依次描述了第一個序列中的各個整數。再接下來一行包含M個在[1, 109]範圍內的整數,依次描述了第二個序列中的各個整數。

Output

    對於每組資料,輸出有多少種情況滿足x

 + y <= K

Sample Input

2 3 5
3 7
3 5 7
4 5 6
1 2 3 4
1 2 3 4 5
4 5 9
1 2 3 4
1 2 3 4 5

Sample Output

0
14
20

Hint

    其實如果兩個序列並不是有序的,我們也可以先通過排序使其變得有序,然後就和現在的這個題目一樣了,不過由於這個題目並不是為了介紹排序,所以乾脆就直接給出有序的序列了。

    由於int的範圍有限,當要讀入的數或者要輸出的數超出了int的表示範圍但沒有超出long long的表示範圍時,我們就要使用long long了。如果OJ的伺服器是Linux的,那麼用“%lld”(前面是兩個小寫的L)來控制long long的讀入和輸出,而如果OJ的伺服器是Windows的,則需要用“%I64d”(前面是一個大寫的i)來控制long long的讀入和輸出,這一點一般會在OJ的“F.A.Q”有所說明的。由於我們的伺服器是採用的Linux作業系統,所以使用“%lld”就OK了。

    比如這個題目,極端情況就所有情況都滿足,也就是N*M中情況,當N和M都取極限值時,顯然結果就需要用long long來儲存並輸出了。

    那麼這個題目具體要怎麼做呢?

    也許你一眼就看出來了,兩層for迴圈就可以搞定嘛,不過很可惜這樣估計要妥妥超時,要不試一下?

    我們不妨仔細梳理一下思路,兩層for迴圈做法的基本思想應當是首先列舉第一個序列中拿出的數x,然後再尋找第二個序列中有多少個整數y滿足x+y<=K。其實我們不難發現,每次只要找到滿足x+y<=K最大的y就可以了,不妨記為max_y,那麼max_y以及max_y之前的數是一定都滿足x+y<=K的,這樣根據max_y所在的位置,我們就能直接計算出對於當前列舉到的x有多少個y滿足x+y<=K了。而找這個max_y的過程真的需要一層for迴圈嗎?你可能已經想到了,我們完全可以用“二分”的方法去找這個max_y,這樣就能快很多了。如果你對“二分”還沒有任何概念也沒關係,因為我們還有另外一種辦法也可以達到這個目的。

    我們不妨設先後列舉到的兩個相鄰的x分別為x1和x2,並設x1對應的max_y為max_y1,x2對應的max_y為max_y2,由於x1<x2,我們可以得到max_y2<=max_y1。但這個有什麼用呢?當然有用了,我們在找max_y2的時候就可以直接從max_y1開始遞減去找了。如果再列舉到x3呢?那麼一樣有max_y3<=max_y2,我們直接從max_y2開始遞減去找max_y3。不過也許你可能會懷疑了:這樣真的能比兩層for迴圈快嗎?好像這樣也是兩個變數不停地在迴圈呀?

    至於為什麼會快還是交由你自己來思考吧,如果你對剛剛說的思路還沒有什麼概念的話不妨結合下面我給出的示例程式碼來看一下。


程式碼:

#include <iostream>
#include<algorithm>
using namespacestd;

int listn[100000];
int listm[100000];

int main()
{
	ios_base::sync_with_stdio(false);
	int n, m, k, temp;
	while (cin >> n >> m >> k)
	{
		for(int i = 0; i < n; i++)cin >> listn[i];
		for (int i = 0; i < m;
i++) { cin >> temp; listm[m - 1 - i] = k - temp; } long long sum = m; sum *= n; int key = 0; for (int i = 0; i < n; i++) { while (listm[key] < listn[i] && key < m)key++; sum -= key; } cout << sum << endl; } return 0; }

相關推薦

csu oj 1343 Long Long

來看 ont 開始 描述 color 個數 sample nbsp for循環 Description 現在有兩個單調遞增序列,第一個序列有N個整數,第二個序列有M個整數,現在你可以從第一個序列中選一個數x,然後從第二個序列中選一個數y,那麽有多少種情況滿足x+y

CSU 1343: Long Long

題目:Description    現在有兩個單調遞增序列,第一個序列有N個整數,第二個序列有M個整數,現在你可以從第一個序列中選一個數x,然後從第二個序列中選一個數y,那麼有多少種情況滿足x+y<

POJ 2429 long long 質因數分解

cst factor pro calc can 返回 a + b names 素數 GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissio

__int64與long longlong的區別

ini operator 一個 version 隱式轉換 sca char ann 擴展 首先聲明轉自 http://www.cnblogs.com/ChenDinghao/p/6480937.html 首先來看一看int、long、long long的取值範圍 int

int ,long long等範圍

範圍 bsp nbsp sig 最小 int long long 最小值 最大值 unsigned int 0~4294967295 int -2147483648~2147483647 unsigned long 0~4294967295long -2

int、longlong long取值範圍

family lin line ng- sig color long long tom p s unsigned int 0~4294967295 int -2147483648~2147483647 unsigned long 0~4294967295

Long Long Message POJ - 2774

ide ostream 符號 http poj mes get names class Long Long Message POJ - 2774 題意:求兩個串的最長公共字串。 用特殊符號連接兩個字符串,後綴數組。 枚舉height,如果sa[i]和sa[i-1]分別屬

牛客練習賽7 E 珂朵莉的數列(樹狀數組+爆long long解決方法)

src main stdin scanf return n) can print con https://www.nowcoder.com/acm/contest/38/E 題意: 思路: 樹狀數組維護。從大佬那裏學習了如何處理爆long long的方法

【POJ2774】Long Long Message(後綴數組)

火車票 字符串 cat ios swa char 們的 same getc 【POJ2774】Long Long Message(後綴數組) 題面 Vjudge Description Little cat在Byterland的首都讀物理專業。這些天他收到了一條悲傷地信息:

[POJ2774]Long Long Message

long esp cstring poj2774 href line 子串 class max vjudge 一句話題意 給兩個串,求最長公共子串。 sol 把兩個串接在一起求後綴數組。其實中間最好用一個沒有出現過的字符連接起來。 判斷如果\(SA[i]\)和\(SA[i-

POJ.2774.Long Long Message(後綴數組 倍增)

前綴 中間 題目 std str 後綴 string pri -m 題目鏈接 \(Description\) 求兩個字符串最長公共子串 \(Solution\) 任何一個子串一定是某個後綴的前綴 可以將兩個字符串拼在一起,中間用一個從未出現過的字符隔開,這樣ht[]的最大值

快速冪取模(當數很大時,相乘long long也會超出的解決辦法)

結合 超出 但是 long 數字 也會 連續 return result 當幾個數連續乘最後取模時,可以將每個數字先取模,最後再取模,即%對於*具有結合律。但是如果當用來取模的數本身就很大,采取上述方法就不行了。這個時候可以借鑒快速冪取模的方法,來達到大數相乘取模的效果。

long long 的輸入輸出問題

src alt -i 圖片 輸出 long blog 技術分享 www 參考博客:https://www.byvoid.com/zhs/blog/c-int64 long long 的輸入輸出問題

[POJ 2774]Long Long Message

math subset printf += get() std http namespace des Description 題庫鏈接 給定兩個字符串 \(A\) 和 \(B\) ,求最長公共子串。 \(1\leq |A|,|B|\leq 100000\) Solution

(又FST在long long!!)Codeforces Round #293 (Div. 2)C. Anya and Smartphone

我的天,又FST在  long long piapiapia 扇死  題意:(我研究了半天才看懂) 第一行輸入應用總數 n ,要一次開啟應用的總數 ,每個螢幕最多的應用數。 第二行按位子(1~n)順序輸入應用的編號; 第三行輸入要依次開啟的應用。 問我們要求需

152_關於int、short int、long int、long long 的區別

關於int、short int、long int、long long 的區別 2016年04月18日 18:31:12 閱讀數:11170 標籤: C++int 更多 個人分類: C++ 版權宣告:本文為博主原創文章,未經博主允許不得轉載

要時刻注意 long long

long long是一個神奇的東西,它會伴隨你的整個OI生涯。(用Python肯定不會有這事)無論你有多強,你都要注意long long。即使你去考NOI,你還是得注意。 在今天的模擬賽中,我又一次得到了慘痛的教訓。原本T1的標算因沒開long long,變成了50分。我從rank10->

long long 範圍

unsigned   int     0~4294967295   (10位數,4e9) int           

c語言longlong long的取值範圍

溢位和取值範圍 C語言的整型溢位問題 整數溢位 int、long int 、long long int 佔用位元組 《C和指標》中寫過:long與int:標準只規定long不小於int的長度,int不小於short的長度。 double與int型別的儲存機制不同

C++中的long long和 int64型別(轉載)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!