qzezoj 1568 反覆求和

2021-10-03 23:00:39 字數 1939 閱讀 6681

題面傳送門

這道題首先要有乙個思維的轉換:對於選擇滿足0≤i

<

n0\leq i< n

0≤i<

n 的任意下標i

ii ,並讓a

aa陣列裡下標為i

ii處的值變為sum

sumsu

m。把賦值的思維轉化成選擇乙個下標,把除了這個下標的所有值加到它身上

這道題正著想很難想,俗話說得好,正難則反,所以我們不如倒著做

對於已經構造好的a

aa序列,首先我們要確定它最後修改的位置。很明顯,最後修改的位置是最大的,那麼我們要計算它修改前的值,我們的思維轉換就要派上用場了,其他值是不變的,所以我們維護乙個總值,算出其他值,在這個數上減去就好了,一直到所有數都為1

11或有的數<

1<1

<

1為止。

對於找最大值的過程,我們可以用乙個大根堆維護。

#include

using

namespace std;

long

long n,m,tot,a[

100039

],b[

100039

],sum,ans,pus,sss;

priority_queue<

long

long

,vector<

long

long

>

,less<

long

long

>

> s;

intmain()

if(tot==n)

printf

("t");

else

printf

("n");

}

但這樣有乙個問題,有幾組hac

khack

hack

資料跑不過去。比如下面這組:

2

11000000000

我們發現重複減了很多次,我們可以計算出它要減幾次,然後一併減掉。我們把這個元素拿出來,再取出乙個堆頂的值,然後將他們兩個作差後的結果除以減去的值向下取整再+1+1

+1,這就是要減的次數,用乘法一併減掉就可以了

ac**:

#include

using

namespace std;

long

long n,m,tot,a[

100039

],b[

100039

],sum,ans,pus,sss,now;

priority_queue<

long

long

,vector<

long

long

>

,less<

long

long

>

> s;

intmain()

ans=sum-pus;

now=s.

top();

sum-=(

(pus-now)

/ans+1)

*ans;

pus-=(

(pus-now)

/ans+1)

*ans;

if(pus==

1) tot++

;else

if(pus<1)

break

;else s.

push

(pus);}

if(tot==n)

printf

("t");

else

printf

("n");

}

還有,不開lon

glon

glong long

longlo

ng見祖宗啊!!!

156 合併區間

5.3 本來以為是排好序的區間,後來發現不是。definition of interval public class interval class solution for int i 0 i intervals.size 1 i if tmp1.start tmp2.end tmp1.start ...

1 5 6 泛型方法

除了定義泛型類,泛型結構外,還可以定義泛型放啊發,泛型方法可以在泛型型別定義 也可以在非泛型類中定義。下面是定義的乙個泛型方法,該泛型型別用於兩個引數。前面有介紹ref關鍵字 void swap ref t x,ref t y 通過傳入型別來呼叫泛型類 int i 4 int j 5 swap re...

qzezoj 1540 糖果峽谷

題面傳送門 三十分 於是我只能重新想思路。然後就只得了35 3535 分。考試結束後老師叫我們自己去網上找題解,然而我發現,居然沒有任何一篇luo gu luogu luog u題解是正解。於是我準備發一篇題解來k kk掉luo gu luogu luog u所有題解。正解 我們先把這個峽谷想象成乙...