Hỏi về lập trình bài toán dạng vòng tròn

Hi bác bác, em là dân newbie tập giải đề, chuyện là em có bài toán như ở dưới và có 1 đoạn code để vạch ra phương hướng giải quyết nhưng vẫn còn nhiều khúc mắc, không biết bác nào có thể giúp em vạch ra định hướng để làm bài toán này không ạ ?
Code của em :

include <stdio.h>
int main();
{
    int n,q,d,s,t,p,i,j,thaotac,tong;
    tong=0;
    scanf("d",&n);scanf("d",&q);
    int mang[n];
    for (i=0 ; i<n ; i++)
        scanf("d",&mang[i]);
    j=1;
    while (j<=q)
    {
        scanf("d",&thaotac);
        if (thaotao == 1 )
            {
                scanf("d",&d);
                /* thao tac doi phan tu */ ( chưa rõ là đổi như thế nào ) 
                for
            }
        if (thaotac == 2 )
            {
                scanf("d",&s);
                scanf("d",&t);
                scanf("d",&p);
                for (i=s;i<=t;i++)
                    mang[i]=q;
            }
        if (thaotac == 3)
            {
                for (i=s;i<=t;i++)
                    tong=tong+mang[i];
            }
        j=j+1;
    }
}

“Xoay” là thay đổi vị trí số 1 của “vòng tròn” thôi.

Ví dụ, mảng các tấm pin là [3, 4, 2, 1, 6, 9], xoay 1 vị trí thì mảng trở thành [9, 3, 4, 2, 1, 6] (vị trí đầu tiên từ 0 -> 5 – coi mảng là 0-index).

Tổng quát: Vị trí ban đầu cũ là r, xoay d vị trí thì mảng trở thành (r - d) % n.

3 Likes

Bài này thuộc dạng Range Minimum Query.

4 Likes

nó chỉ đấy theo chiều kim đồng hồ mà bác, kiểu như đẩy 1 lần thì thứ tự các phần tử nhảy lên 1, phần từ cuối thì nhảy về thành phần tử ban đầu mà nhỉ, em thấy kiểu của bác là có vẻ là xoay ngược chiều kim đồng hồ thì phải @@

Mình lộn chiều, nhưng sửa index đi là được nhé.

1 Like

Nên làm một biến counter, mỗi lần có truy vấn xoay thì + (modulo) vào counter này :smiley:

Còn vòng qua 1 vòng thì tách thành 2 truy vấn cho 2 range.

4 Likes

nghe hơi cao so với những gì em đang biết bây giờ hic :<

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?